package com.echat.elocation.util;

/**
 *
 * @author lihao
 *
 * @date 2018/7/16 16:06
 */
public class HexStringUtils {

    private static final char[] DIGITS_HEX = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

    private static char[] encodeHex(byte[] data) {
        int l = data.length;
        char[] out = new char[l << 1];
        for (int i = 0, j = 0; i < l; i++) {
            out[j++] = DIGITS_HEX[(0xF0 & data[i]) >>> 4];
            out[j++] = DIGITS_HEX[0x0F & data[i]];
        }
        return out;
    }

    private static byte[] decodeHex(char[] data) {
        int len = data.length;
        if ((len & 0x01) != 0) {
            throw new RuntimeException("字符个数应该为偶数");
        }
        byte[] out = new byte[len >> 1];
        for (int i = 0, j = 0; j < len; i++) {
            int f = toDigit(data[j], j) << 4;
            j++;
            f |= toDigit(data[j], j);
            j++;
            out[i] = (byte) (f & 0xFF);
        }
        return out;
    }

    private static int toDigit(char ch, int index) {
        int digit = Character.digit(ch, 16);
        if (digit == -1) {
            throw new RuntimeException("Illegal hexadecimal character " + ch + " at index " + index);
        }
        return digit;
    }

    public static String toHexString(byte[] bs) {
        return new String(encodeHex(bs));
    }

    public static byte[] hexString2Bytes(String hex) {
        return decodeHex(hex.toCharArray());
    }

    public static byte[] chars2Bytes(char[] bs) {
        return decodeHex(bs);
    }

    /**
     * 前面填充0
     *
     * @param text   需要补零的对象
     * @param length 补零后的长度
     * @return {@link String}
     */
    public static String preFillZero(Object text, int length) {
        StringBuilder builder = new StringBuilder();
        if (text == null) {
            for (int i = 0; i < length; i++) {
                builder.append("0");
            }
        } else {
            for (int i = String.valueOf(text).length(); i < length; i++) {
                builder.append("0");
            }
            builder.append(text);
        }
        return builder.toString();
    }

    /**
     * 后面填充0
     *
     * @param text   需要补零的对象
     * @param length 补零后的长度
     * @return {@link String}
     */
    public static String sufFillZero(Object text, int length) {
        StringBuilder builder = new StringBuilder();
        if (text == null) {
            for (int i = 0; i < length; i++) {
                builder.append("0");
            }
        } else {
            builder.append(text);
            for (int i = String.valueOf(text).length(); i < length; i++) {
                builder.append("0");
            }
        }
        return builder.toString();
    }

    public static void main(String[] args) {
        String s = "abc你好";
        String hex = toHexString(s.getBytes());
//        String decode = hexString2Bytes(hex);
        System.out.println("原字符串:" + s);
        System.out.println("十六进制字符串:" + hex);
//        System.out.println("还原:" + decode);
    }

//    public static String bytesToHex(byte[] bytes){
//        char[] hexChars = new char[bytes.length *2];
//
//        for(int i = 0; i < bytes.length; i++){
//            int v = bytes[i] & 0xFF;
//            hexChars[i * 2] = hexArray[v >>> 4];
//            hexChars[i * 2 + 1] = hexArray[v & 0x0F];
//        }
//
//        return new String(hexChars);
//    }
//
//    public static byte[] hexToBytes(String hexRepresentation) {
//        int len = hexRepresentation.length();
//        byte[] data = new byte[len / 2];
//
//        for (int i = 0; i < len; i += 2) {
//            data[i / 2] = (byte) ((Character.digit(hexRepresentation.charAt(i), 16) << 4)
//                    + Character.digit(hexRepresentation.charAt(i + 1), 16));
//        }
//
//        return data;
//    }
//
//    /**
//     * 将byte[]数组转化为String类型
//     * @param arg
//     *            需要转换的byte[]数组
//     * @param length
//     *            需要转换的数组长度
//     * @return 转换后的String队形
//     */
//    public static String toHexString(byte[] arg, int length) {
//        StringBuilder result = new StringBuilder();
//        if (arg != null) {
//            for (int i = 0; i < length; i++) {
//                result.append(Integer.toHexString(
//                        arg[i] < 0 ? arg[i] + 256 : arg[i]).length() == 1 ? "0"
//                        + Integer.toHexString(arg[i] < 0 ? arg[i] + 256
//                        : arg[i])
//                        : Integer.toHexString(arg[i] < 0 ? arg[i] + 256
//                        : arg[i])).append(" ");
//            }
//            return result.toString();
//        }
//        return "";
//    }
//

//
//    public static void main(String[] args) {
//        String s = "abc你好";
//        String hex = toHexString(s.getBytes(), 5);
//        System.out.println("原字符串:" + s);
//        System.out.println("十六进制字符串:" + hex);
//    }

}
